package com.tulei.common.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private String redisPort;

    @Value("${spring.redis.password}")
    private String redisPassword;

    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {
        Config config = new Config();
        
        // 单机模式配置
        config.useSingleServer()
              .setAddress("redis://" + redisHost + ":" + redisPort)
              .setPassword(redisPassword); // 如果没有密码可以省略此行
        
        // 如果是集群、哨兵、主从等其他模式，这里会有不同的配置方法，例如：
        // config.useClusterServers()...
        // config.useSentinelServers()...


        // 自定义Jackson序列化配置
        ObjectMapper objectMapper = new ObjectMapper();
        // 禁用时间戳的使用，使得序列化后的时间是可读的日期格式，这只是一个例子，根据需要调整
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        // 使用自定义的ObjectMapper创建JsonJacksonCodec
        JsonJacksonCodec codec = new JsonJacksonCodec(objectMapper);

        // 设置整个Redisson客户端使用的序列化方式
        config.setCodec(codec);

        return Redisson.create(config);
    }
}